import cv2
import numpy as np

img1=cv2.imread(r'C:\Users\ASUS\Desktop\6.jpg') #读取图片
img2=cv2.imread(r'C:\Users\ASUS\Desktop\7.jpg') #读取图片
img1=cv2.resize(img1,(480,480),interpolation=cv2.INTER_CUBIC)
img2=cv2.resize(img2,(480,480),interpolation=cv2.INTER_CUBIC)
sift=cv2.xfeatures2d.SIFT_create()#创建SIFT

gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)#灰度化
kp1,des1=sift.detectAndCompute(img1,None)#特征描述子

gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
kp2,des2=sift.detectAndCompute(img2,None)

hmerge=np.hstack((gray1,gray2))#水平拼接
cv2.imshow('gray',hmerge)
cv2.waitKey(0)

img3=cv2.drawKeypoints(img1,kp1,img1,color=(0,0,255))#用红色画出特征点
img4=cv2.drawKeypoints(img2,kp2,img2,color=(0,0,255))
hmerge=np.hstack((img3,img4))#水平拼接
cv2.imshow('point',hmerge)
cv2.waitKey(0)

#使用BFmatch匹配
bf=cv2.BFMatcher()
matches=bf.knnMatch(des1,des2,2)

good=[]
for m,n in matches:
    if m.distance<0.9*n.distance:
        good.append([m])

img5=cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv2.imshow('BFmatch',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

'''
使用BFMATCH的匹配方法匹配特征点，发现sift对旋转大棋盘没有较好的找到角点，大部分找到的特征点是棋盘格的中心，但对背景种得键盘电脑等匹配较好。
使用风景照的时候能较好的检测到角点并进行匹配。
'''